package com.example.backend.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 订单编号生成工具类
 * 生成规则：业务前缀 + 日期 + 随机数 + 序列号
 * 示例：ORD202506051234567890123
 */
public class OrderNumberGenerator {
    // 业务前缀，可根据不同业务类型设置不同前缀
    private static final String BUSINESS_PREFIX = "ORD";

    // 日期格式
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");

    // 随机数生成器
    private static final Random RANDOM = new Random();

    // 序列号，原子操作保证线程安全
    private static final AtomicInteger SEQUENCE = new AtomicInteger(1);

    // 随机数长度
    private static final int RANDOM_LENGTH = 5;

    // 序列号最大长度
    private static final int SEQUENCE_MAX_LENGTH = 5;

    // 最大序列号值
    private static final int MAX_SEQUENCE = (int) Math.pow(10, SEQUENCE_MAX_LENGTH) - 1;

    /**
     * 生成唯一订单编号
     *
     * @return 订单编号字符串
     */
    public static synchronized String generateOrderNumber() {
        // 获取当前日期
        String dateStr = DATE_FORMAT.format(new Date());

        // 生成随机数
        String randomStr = generateRandomNumber(RANDOM_LENGTH);

        // 获取序列号
        int seq = SEQUENCE.getAndIncrement();

        // 当序列号达到最大值时重置
        if (seq >= MAX_SEQUENCE) {
            SEQUENCE.set(1);
        }

        // 格式化序列号，不足位数前补0
        String seqStr = String.format("%0" + SEQUENCE_MAX_LENGTH + "d", seq);

        // 组合订单号
        return BUSINESS_PREFIX + dateStr + randomStr + seqStr;
    }

    /**
     * 生成指定长度的随机数字字符串
     *
     * @param length 随机数长度
     * @return 随机数字字符串
     */
    private static String generateRandomNumber(int length) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(RANDOM.nextInt(10));
        }
        return sb.toString();
    }

    /**
     * 示例：测试订单号生成
     */
    public static void main(String[] args) {
        // 测试生成10个订单号
        for (int i = 0; i < 10; i++) {
            System.out.println(generateOrderNumber());
        }
    }
}
